package com.flyqiu.form.core.col;

import com.flyqiu.form.api.col.FlyQiuStoreColTypeManage;
import com.flyqiu.form.api.col.FlyQiuStoreColTypeMapper;
import com.flyqiu.form.common.col.SqlColType;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

public class DefaultFlyQiuStoreColTypeManage implements FlyQiuStoreColTypeManage {
    private final Map<String, FlyQiuStoreColTypeMapper> storeColTypeMap = new HashMap<>();

    @Override
    public void registerStoreColType(String storeType, FlyQiuStoreColTypeMapper storeColType) {
        if (StringUtils.isAllBlank(storeType)) {
            return;
        }
        storeColTypeMap.put(storeType, storeColType);
    }

    @Override
    public void unregisterStoreColType(String storeType) {
        if (StringUtils.isAllBlank(storeType)) {
            return;
        }
        storeColTypeMap.remove(storeType);
    }

    @Override
    public SqlColType getStoreColType(String storeType, String colType, boolean isThrow) {

        validateInput(storeType, colType); // 参数校验

        FlyQiuStoreColTypeMapper flyQiuStoreColType = storeColTypeMap.get(storeType);
        if (flyQiuStoreColType == null) {
            throwExceptionIfRequired("未注册存储类型：" + storeType, isThrow);
            return null; // 为了保持函数签名不变，虽然到这里已经抛出异常
        }

        Map<String, SqlColType> defaultColTypeConfig = flyQiuStoreColType.getColTypeConfig();
        SqlColType iSqlColumnType = defaultColTypeConfig.get(colType);
        if (iSqlColumnType != null) {
            return iSqlColumnType;
        }

        // 因为已经确认找到了存储类型，所以这里的异常应该是针对列类型未注册
        throwExceptionIfRequired("未注册列类型：" + colType, isThrow);
        return null; // 同上，保持函数签名不变
    }

    private void validateInput(String storeType, String colType) {
        if (storeType == null || colType == null) {
            throw new IllegalArgumentException("存储类型和列类型不能为空");
        }
    }

    private void throwExceptionIfRequired(String errorMessage, boolean isThrow) {
        if (!isThrow) {
           return;
        }
        throw new IllegalArgumentException(errorMessage);
    }
}
